#include "unistd.h"
#include "sys/time.h"
#include "stdio.h"
#include "pthread.h"
#include "stdlib.h"

/*
一个线程串行执行多个长时间的计算任务VS多个线程并行执行多个长时间的计算任务
*/

// 这是个求num的平方的函数      耗时5s
int calc_sqr(int num)
{
    sleep(1);
    return num * num;
}

// 线程函数         耗时1s
void *thread_fun(void *arg)
{
    int num = *(int *)arg;
    int *result = malloc(sizeof(int));
    *result = num * num;
    sleep(1);
    return result;
}

int main(int argc, char const *argv[])
{
    int item[5] = {1, 2, 3, 4, 5};
    int sqrs[5];

    // 串行执行
    struct timeval start, end;
    gettimeofday(&start, NULL);

    // 启动5个线程分别计算items中每个数的平方
    pthread_t threads[5];
    for (int i = 0; i < 5; i++)
    {
        pthread_create(&threads[i], NULL, (void *)thread_fun, (void *)&item[i]);
    }

    // 等待每个线程执行完毕  并获取平均值
    for (int i = 0; i < 5; i++)
    {
        // 声明一个 void 类型的指针，用于存储 pthread_join 函数返回的线程返回值
        void *result;
        // 调用 pthread_join 函数等待第 i 个线程执行结束
        // threads[i] 是第 i 个线程的线程 ID
        // &result 是一个指针，用于接收线程函数的返回值
        pthread_join(threads[i], &result);
        // 将 result 指针转换为 int 类型指针，然后解引用，将结果存储到 sqrs 数组的第 i 个位置
        sqrs[i] = *(int *)result;
    }

    // 计算串行执行的时间
    gettimeofday(&end, NULL);
    long timeuse = 1000000 * (end.tv_sec - start.tv_sec) + end.tv_usec - start.tv_usec;
    printf("串行执行时间: %ld us\n", timeuse);

    // 计算平方和
    int sum = 0;
    for (int i = 0; i < 5; i++)
    {
        sum += sqrs[i];
    }
    printf("平方和: %d\n", sum);

    return 0;
}